package simulaco.web.action;

import gminet.infra.business.BusinessException;
import gminet.infra.db.TransactionException;
import gminet.infra.toolkit.StringToolkit;
import gminet.infra.web.WebException;

import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.SelectItem;

import simulaco.business.UsuarioBusiness;
import simulaco.business.UsuarioPerfilBusiness;
import simulaco.business.UsuarioSituacaoBusiness;
import simulaco.dto.Acao;
import simulaco.dto.Usuario;
import simulaco.dto.UsuarioPerfil;
import simulaco.dto.UsuarioSituacao;

@ManagedBean(name = "adminUsuarioAction")
@SessionScoped
public class AdminUsuarioAction extends WebAction {

    private static final long serialVersionUID = 8699535689521195806L;

    private Usuario usuario;
    private String novaSenhaAcesso;
    private String confirmacaoSenhaAcesso;

    private List<Usuario> usuarios;

    public AdminUsuarioAction() {

        super();
    }

    public String listar() throws WebException {

        verificarLogin(UsuarioPerfil.ADMINISTRADOR);
        String pageReturn = "";
        try {
            setUsuarios(UsuarioBusiness.findAll());
            pageReturn = "adminListaUsuarios";
        } catch (TransactionException te) {
            throw new WebException(te);
        }
        return pageReturn;
    }

    public void alterarSituacao() throws WebException {

        verificarLogin(UsuarioPerfil.ADMINISTRADOR);
        try {
            if (getAcao().equals(Acao.ATIVAR)) {
                getUsuario().setSituacao(UsuarioSituacao.HABILITADO);
            } else if (getAcao().equals(Acao.DESATIVAR)) {
                getUsuario().setSituacao(UsuarioSituacao.DESABILITADO);
            }
            UsuarioBusiness.updateStatus(getUsuario());
            // ATUALIZA LISTA
            setUsuarios(UsuarioBusiness.findAll());
        } catch (BusinessException be) {
            addBusinessException("frmListaUsuarios", be);
        } catch (TransactionException te) {
            throw new WebException(te);
        }
    }

    public String prepararAlteracao() throws WebException {

        verificarLogin(UsuarioPerfil.ADMINISTRADOR);
        String pageReturn = "";
        try {
            this.novaSenhaAcesso = null;
            this.confirmacaoSenhaAcesso = null;
            this.usuario = UsuarioBusiness.findByPK(getUsuario().getCodigo());
            if (this.usuario == null) {
                throw new WebException("Usuário não encontrado.");
            }
            pageReturn = "adminAlteraUsuarioFromLista";
        } catch (TransactionException te) {
            throw new WebException(te);
        }
        return pageReturn;
    }

    public String alterar() throws WebException {

        verificarLogin(UsuarioPerfil.ADMINISTRADOR);
        String pageReturn = "";
        try {
            // VERIFICA SE ALTEROU SENHA DE ACESSO
            if (StringToolkit.isFill(getNovaSenhaAcesso())) {
                if (StringToolkit.isFill(getConfirmacaoSenhaAcesso())) {
                    if (getNovaSenhaAcesso().equals(getConfirmacaoSenhaAcesso())) {
                        getUsuario().setSenhaAcesso(getNovaSenhaAcesso());
                    } else {
                        throw new BusinessException("Confirmação da senha inválida.");
                    }
                } else {
                    throw new BusinessException("Confirmação da senha não informada.");
                }
            }
            // ALTERA DADOS DO USUARIO
            UsuarioBusiness.updateDados(getUsuario());
            //
            pageReturn = listar();
        } catch (BusinessException be) {
            addBusinessException("frmUsuario", be);
            pageReturn = "adminAlteraUsuario";
        } catch (TransactionException te) {
            throw new WebException(te);
        }
        return pageReturn;
    }

    public List<SelectItem> getSituacaoItems() throws WebException {

        List<SelectItem> situacaoItems = new ArrayList<SelectItem>();
        List<UsuarioSituacao> listaSituacao = UsuarioSituacaoBusiness.findAll();
        for (UsuarioSituacao situacao : listaSituacao) {
            situacaoItems.add(new SelectItem(new Integer(situacao.getCodigo()), situacao.getNome()));
        }
        return situacaoItems;
    }

    public List<SelectItem> getPerfilItems() throws WebException {

        List<SelectItem> perfilItems = new ArrayList<SelectItem>();
        List<UsuarioPerfil> listaPerfil = UsuarioPerfilBusiness.findAll();
        for (UsuarioPerfil perfil : listaPerfil) {
            perfilItems.add(new SelectItem(new Integer(perfil.getCodigo()), perfil.getNome()));
        }
        return perfilItems;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public List<Usuario> getUsuarios() {
        return usuarios;
    }

    public void setUsuarios(List<Usuario> usuarios) {
        this.usuarios = usuarios;
    }

    public String getNovaSenhaAcesso() {
        return novaSenhaAcesso;
    }

    public void setNovaSenhaAcesso(String novaSenhaAcesso) {
        this.novaSenhaAcesso = novaSenhaAcesso;
    }

    public String getConfirmacaoSenhaAcesso() {
        return confirmacaoSenhaAcesso;
    }

    public void setConfirmacaoSenhaAcesso(String confirmacaoSenhaAcesso) {
        this.confirmacaoSenhaAcesso = confirmacaoSenhaAcesso;
    }

}
